package com.easybuilder.core.menu.service.impl;

import com.easybuilder.common.enums.CacheKey;
import com.easybuilder.common.utils.RedisUtil;
import com.easybuilder.core.menu.dao.MenuDao;
import com.easybuilder.core.menu.entity.SysMenu;
import com.easybuilder.core.menu.service.MenuService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author ZXS
 * @version 1.0
 * @description 类
 * @date 2021-6-20 14:49
 */
@Service
public class MenuServiceImpl implements MenuService {

    @Resource
    private MenuDao menuDao;

    @Override
    public List<SysMenu> getAll() {
        // 1.尝试从缓存中读取
        List<SysMenu> cache = RedisUtil.getValue("SYS_MENU", List.class);
        // 如果缓存数据为空从数据库中读取
        if (cache == null) {
            // 1.1 先查询顶级节点
            cache = menuDao.getByParentId(null);
            // 1.2 设置子节点
            if (cache != null && cache.size() > 0) {
                cache.forEach(parent -> {
                    setChild(parent);
                });
            }
            // 1.3 存入缓存
            RedisUtil.setValue("SYS_MENU", cache);
        } else {
            // 2.如果缓存中有数据，直接返回
            return cache;
        }

        return cache;
    }

    @Override
    public List<SysMenu> loadByPid(Long pid) {
        List<SysMenu> list = menuDao.getByParentId(pid);
        // 设置是否存在子节点的标识
        for (SysMenu sysMenu : list) {
            SysMenu menu = new SysMenu();
            menu.setParentId(sysMenu.getId());
            int count = menuDao.selectCount(menu);
            sysMenu.setHasChildren(count>0);
        }
        return list;
    }

    @Override
    public void save(SysMenu sysMenu) {
        if (sysMenu.getId() == null) {
            menuDao.insert(sysMenu);
        } else {
            menuDao.updateByPrimaryKeySelective(sysMenu);
        }
        // 清空菜单缓存数据
        RedisUtil.setValue(CacheKey.SYS_MENU.getKey(), null);
    }

    @Override
    public void delete(Long id) {
        SysMenu sysMenu = new SysMenu();
        sysMenu.setId(id);
        menuDao.deleteByPrimaryKey(sysMenu);
        // 清空菜单缓存数据
        RedisUtil.setValue(CacheKey.SYS_MENU.getKey(), null);
    }

    private void setChild(SysMenu sysMenu) {
        Long id = sysMenu.getId();
        List<SysMenu> list = menuDao.getByParentId(Long.valueOf(id));
        sysMenu.setChildren(list);
        if (list != null && list.size() > 0) {
            list.forEach(child -> {
                setChild(child);
            });
        }
    }
}
